
#include "test_case.hpp"

/*
g++ test_case.cpp -static -I../insdir/include -L../insdir/lib -lboost_system -lpthread -lboost_coroutine -lboost_context
*/

int test_case0_p11_boost_version(void) {
    using namespace std;

    cout << BOOST_VERSION << endl;
    cout << BOOST_LIB_VERSION << endl;
    cout << BOOST_PLATFORM << endl;
    cout << BOOST_COMPILER << endl;
    //cout << BOOST_STDLIB << endl;
    return 0;
}

/*

注意pull_type和push_type的操作已经没有了，那协程是如何切换的呢？ 切换发生在pipe.pop( )中，
fibers::buffered_channel是一个缓存队列，用来传输数据，pop的底层检测到没有数据，会就开始让出cpu，
底层的协程调度器就开始调度别的协程进行运行，没有看过源码不知道执行到pipe.push的时候是否有没有发生调度，
也许有也许没有，但都不太重要，因为这就和线程是一样的；

由于fiber中有调度器的存在，当前协程主动让出cpu，调度器让别的协程运行，比如上面的pipe.pop()，
相当执行了一个协程的co_yield()操作让出cpu；所以，某个协程中如果有阻塞操作，将导致整个线程都处于阻塞，所有协程都被阻塞

*/

void callMe(boost::fibers::buffered_channel<std::string>& pipe) {
    pipe.push("hello world");
}

void test_case1_fiber() {
  
  using namespace std;
  using namespace boost;

    fibers::buffered_channel<string> pipe(2);
    fibers::fiber f([&]() {callMe(pipe); });
    f.detach();
    string str;
    std::cout<<"start pop"<<std::endl;
    pipe.pop(str); //切换协程运行
    std::cout<<"get str:"<<str<<std::endl;

    return;
}

int main() {

    test_case0_p11_boost_version();
    //test_case32_6();
    test_case1_fiber();
    return 0;
}   